var timestamp;

/*
 * 拼接对象为请求字符串
 * 对于需要编码的文本（比如说中文）我们要进行编码
 * @param {Object} obj - 待拼接的对象
 * @returns {string} - 拼接成的请求字符串
 **/
export function formatGetUri(obj = {}) {
	if (JSON.stringify(obj) != "{}") {
		const params = []
		Object.keys(obj).forEach((key) => {
			let value = obj[key]
			if (typeof value !== 'undefined' || value !== null) {
				params.push([key, encodeURIComponent(value)].join('='))
			}
		})
		return "?" + params.join('&')
	} else {
		return ""
	}
}

/**
 * 唯一数
 * @param {Object} prefix
 */
export function ID2(prefix) {
	return (prefix || '') + new Date().getTime().toString(36) + Math.random().toString(36).slice(2);
};

/**
 * 删除URL中指定search参数,会将参数值一起删除
 * @param {string} url 地址字符串
 * @param {array} aParam 要删除的参数key数组，如['name','age']
 * @return {string} 返回新URL字符串
 */
export function ridUrlParam(url, aParam) {
	aParam.forEach(item => {
		const fromindex = url.indexOf(`${item}=`) //必须加=号，避免参数值中包含item字符串
		if (fromindex !== -1) {
			// 通过url特殊符号，计算出=号后面的的字符数，用于生成replace正则
			const startIndex = url.indexOf('=', fromindex)
			const endIndex = url.indexOf('&', fromindex)
			const hashIndex = url.indexOf('#', fromindex)

			let reg;
			if (endIndex !== -1) { // 后面还有search参数的情况
				const num = endIndex - startIndex
				reg = new RegExp(`${item}=.{${num}}`)
				url = url.replace(reg, '')
			} else if (hashIndex !== -1) { // 有hash参数的情况
				const num = hashIndex - startIndex - 1
				reg = new RegExp(`&?${item}=.{${num}}`)
				url = url.replace(reg, '')
			} else { // search参数在最后或只有一个参数的情况
				reg = new RegExp(`&?${item}=.+`)
				url = url.replace(reg, '')
			}
		}
	});
	const noSearchParam = url.indexOf('=')
	if (noSearchParam === -1) {
		url = url.replace(/\?/, '') // 如果已经没有参数，删除？号
	}
	return url
}

/**
 * 时间转换函数
 * @param {Object} time
 */
export function formatTime(time) {
	if (typeof time !== 'number' || time < 0) {
		return time
	}

	var hour = parseInt(time / 3600)
	time = time % 3600
	var minute = parseInt(time / 60)
	time = time % 60
	var second = time

	return ([hour, minute, second]).map(function(n) {
		n = n.toString()
		return n[1] ? n : '0' + n
	}).join(':')
}

/**
 * 坐标转换函数
 * @param {Object} latitude
 * @param {Object} longitude
 */
export function formatLocation(longitude, latitude) {
	if (typeof longitude === 'string' && typeof latitude === 'string') {
		longitude = parseFloat(longitude)
		latitude = parseFloat(latitude)
	}

	longitude = longitude.toFixed(2)
	latitude = latitude.toFixed(2)

	return {
		longitude: longitude.toString().split('.'),
		latitude: latitude.toString().split('.')
	}
}

export function getRad(d) {
	var PI = Math.PI;
	return d * PI / 180.0;
}

/**
 * 获取两个经纬度之间的距离
 * @param lat1 第一点的纬度
 * @param lng1 第一点的经度
 * @param lat2 第二点的纬度
 * @param lng2 第二点的经度
 * @returns {Number}
 */
export function getDistance(lat1, lng1, lat2, lng2) {
	var f = getRad((+lat1 + +lat2) / 2);
	var g = getRad((+lat1 - +lat2) / 2);
	var l = getRad((+lng1 - +lng2) / 2);
	var sg = Math.sin(g);
	var sl = Math.sin(l);
	var sf = Math.sin(f);

	var s, c, w, r, d, h1, h2;
	var a = 6378137.0; //每条路的半径   
	var fl = 1 / 298.257;
	sg = sg * sg;
	sl = sl * sl;
	sf = sf * sf;
	s = sg * (1 - sl) + (1 - sf) * sl;
	c = (1 - sg) * (1 - sl) + sf * sl;
	w = Math.atan(Math.sqrt(s / c));
	r = Math.sqrt(s * c) / w;
	d = 2 * w * a;
	h1 = (3 * r - 1) / 2 / c;
	h2 = (3 * r + 1) / 2 / s;
	s = d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg));
	s = s / 1000;

	s = s.toFixed(2); //指定小数点后的位数。   
	return s;
}

/**
 * 时间转换库
 */
export const dateUtils = {
	UNITS: {
		'年': 31557600000,
		'月': 2629800000,
		'天': 86400000,
		'小时': 3600000,
		'分钟': 60000,
		'秒': 1000
	},
	humanize: function(milliseconds) {
		var humanize = '';
		for (var key in this.UNITS) {
			if (milliseconds >= this.UNITS[key]) {
				humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '前';
				break;
			}
		}
		return humanize || '刚刚';
	},
	format: function(dateStr) {
		var date = this.parse(dateStr)
		var diff = Date.now() - date.getTime();
		if (diff < this.UNITS['天']) {
			return this.humanize(diff);
		}
		var _format = function(number) {
			return (number < 10 ? ('0' + number) : number);
		};
		return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDate()) + '-' +
			_format(date.getHours()) + ':' + _format(date.getMinutes());
	},
	parse: function(str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串，转化为一个Date对象
		var a = str.split(/[^0-9]/);
		return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
	}
};

export function onlyResolvesLast(func) {
	// 利用闭包保存最新的请求 id
	let id = 0

	const wrappedFn = (...args) => {
		// 发起请求前，生成新的 id 并保存
		const fetchId = id + 1
		id = fetchId

		// 执行请求
		const result = func.apply(this, args)

		return new Promise((resolve, reject) => {
			// result 可能不是 promise，需要包装成 promise
			Promise.resolve(result).then(
				(value) => {
					// 只处理最新一次请求
					if (fetchId === id) {
						resolve(value)
					}
				},
				(error) => {
					// 只处理最新一次请求
					if (fetchId === id) {
						reject(error)
					}
				}
			)
		})
	}

	return wrappedFn
}

